package com.chang.tx.service;

import com.chang.tx.dao.BookDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.concurrent.TimeUnit;


// @Transactional(timeout = 3,readOnly = true) // 只读事务中不能带有增删改操作
// @Transactional(noRollbackFor = ArithmeticException.class) // 发生特定特定异常后不进行回滚,但是不回滚不代表事务正常完整执行,途中异常会导致异常之后的操作无法执行,而之前的操作依旧保留执行效果
// @Transactional(propagation = Propagation.REQUIRED) // 如果当前线程上有已经开启的事务可用，那么就在这个事务中运行，也就是事务A调用标记了该传播级别的事务B时，就按照事务A来执行，期间报错全部回滚

@Transactional(propagation = Propagation.REQUIRES_NEW)
// 表示不管当前线程上是否有已经开启的事务，都要开启新事务。同样的场景，每次购买图书都是在buyBook()的事务中执行，
// 因此第一本图书购买成功，事务结束，第二本图书购买失败，只在第二次的buyBook()中回滚，购买第一本图书不受影响，即能买几本就买几本
@Service
public class BookServiceImpl implements BookService {

    @Autowired
    private BookDao bookDao;


    @Override
    public void buyBook(Integer bookId, Integer userId) {

/*        try {
            TimeUnit.SECONDS.sleep(5); // 设置线程休眠五秒,触发超时回滚
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }*/
        // 根据图书id查询图书价格
        Integer price = bookDao.getBookPriceById(bookId);

        // System.out.println(1/0);
        // 更新用户余额
        bookDao.updateUserBalance(userId, bookId);
        // 更新图书表中库存
        // bookDao.updateStock(bookId);


    }
}
